博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Servlet的异常处理
阅读量:7105 次
发布时间:2019-06-28

本文共 4659 字,大约阅读时间需要 15 分钟。

以下内容引用自:

当一个Servlet抛出一个异常时,Web容器在使用了exception-type元素的web.xml中搜索与抛出的异常类型相匹配的配置。

必须在web.xml中使用error-page元素来指定Servlet调用,作为对特定的异常或HTTP状态码作出的响应。

一、web.xml配置

考虑这种情况,有一个ErrorHandler Servelt,当任何已定义的异常或错误出现时就会被调用。以下是要在web.xml中创建的条目。

ErrorHandler
ErrorHandler
ErrorHandler
/ErrorHandler
404
/ErrorHandler
403
/ErrorHandler
javax.servlet.ServletException
/ErrorHandler
java.io.IOException
/ErrorHandler

如果想对所有的异常有一个通用的错误处理程序,那么应该定义如下所示的error-page,而不是为每个异常定义单独的error-page元素:

java.lang.Throwable
/ErrorHandler

以下是异常处理中有关上述web.xml需要注意的点:

  • Servelt ErrorHandler与其他的Servelt的定义方式一样,且在web.xml中配置。

  • 如果状态码有任何错误出现,不管是404(未找到)还是403(禁止),那么ErrorHandler Servlet会被调用。

  • 如果Web应用程序抛出ServletException或IOException,那么Web容器就会调用ErrorHandler Servlet。

  • 可以定义不同的错误处理程序来处理不同类型的错误或异常。

二、请求属性-错误/异常

以下是错误处理Servlet可以访问的请求属性列表,用来分析错误/异常的性质。

属性 描述

javax.servlet.error.status_code

该属性给出状态码,状态码可被存储,并在存储为java.lang.Integer数据类型后可被分析。

javax.servlet.error.exception_type

该属性给出异常类型的信息,异常类型可被存储,并在存储为java.lang.Class数据类型后可被分析。

javax.servlet.error.message

该属性给出确切错误消息的信息,信息可被存储,并在存储为java.lang.String数据类型后可被分析。

javax.servlet.error.request_uri

该属性给出有关URL调用Servlet的信息,信息可被存储,并在存储为java.lang.String数据类型后可被分析。

javax.servlet.error.exception

该属性给出异常产生的信息,信息可被存储,并在存储为java.lang.Throwable数据类型后可被分析。

javax.servlet.error.servlet_name

该属性给出Servlet的名称,名称可被存储,并在存储为java.lang.String数据类型后可被分析。

三、Servlet错误处理程序实例

以下是Servlet实例,用于任何定义的Servlet出现任何错误或异常时的情况。

// Import required java librariesimport java.io.*;import javax.servlet.*;import javax.servlet.http.*;import java.util.*;// Extend HttpServlet classpublic class ErrorHandler extends HttpServlet {  // Method to handle GET method request.  public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException  {      // Analyze the servlet exception             Throwable throwable = (Throwable)      request.getAttribute("javax.servlet.error.exception");      Integer statusCode = (Integer)      request.getAttribute("javax.servlet.error.status_code");      String servletName = (String)      request.getAttribute("javax.servlet.error.servlet_name");      if (servletName == null){         servletName = "Unknown";      }      String requestUri = (String)      request.getAttribute("javax.servlet.error.request_uri");      if (requestUri == null){         requestUri = "Unknown";      }      // Set response content type      response.setContentType("text/html");      PrintWriter out = response.getWriter();      String title = "Error/Exception Information";      String docType =      "\n";      out.println(docType +        "\n" +        "" + title + "\n" +        "\n");      if (throwable == null && statusCode == null){         out.println("

Error information is missing

"); out.println("Please return to the Home Page."); }else if (statusCode != null){ out.println("The status code : " + statusCode); }else{ out.println("

Error information

"); out.println("Servlet Name : " + servletName + "
"); out.println("Exception Type : " + throwable.getClass( ).getName( ) + "
"); out.println("The request URI: " + requestUri + "
"); out.println("The exception message: " + throwable.getMessage( )); } out.println(""); out.println(""); } // Method to handle POST method request. public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}

以常用的方式编译ErrorHandler.java并把类文件放入/webapps/ROOT/WEB-INF/classes中(注意:POM和Eclipse项目忽略这一步)。

将下述配置添加到web.xml文件中来处理异常:

ErrorHandler
ErrorHandler
ErrorHandler
/ErrorHandler
404
/ErrorHandler
java.lang.Throwable
/ErrorHandler

现在,尝试使用一个会产生任何异常的Servlet或者输入一个错误的URL,这将触发Web容器调用ErrorHandler Servlet并显示适当的消息。例如,如果输入了一个错误的URL,那么它将显示如下所示的结果:

上述代码在一些Web浏览器中可能无法工作。因此请尝试使用Mozilla和Safari浏览器,这样上述代码应该能正常工作。

 

测试工程:

转载地址:http://tuchl.baihongyu.com/

你可能感兴趣的文章
学习Verilog的一个博客
查看>>
Python Selenium常见用法介绍
查看>>
Generating Complex Procedural Terrains Using GPU
查看>>
商品标签例子——CSS3 transform 属性
查看>>
Android Xposed框架中创建模块的指导手册
查看>>
hdu 1006 Tick and Tick
查看>>
requirejs+angularjs搭建时手动创建app顶级模块
查看>>
JS中的单引号和双引号
查看>>
ios手机竖屏拍照图片旋转90°问题解决方法
查看>>
全屏显示窗口及无标题
查看>>
编码与copy
查看>>
乐视(LeTV)占用8080端口
查看>>
s28 LNMP架构服务搭建
查看>>
import * as x from 'xx' 和 import x from 'xx'
查看>>
Python Django 之 Template 模板的使用
查看>>
window与document对象的学习
查看>>
foreach遍历对象的属性
查看>>
loj2436 糖果
查看>>
jQuery.clean()方法源码分析(一)
查看>>
分析fork后多进程对文件的共享
查看>>